﻿/// <reference path="lib.js" />
/// <reference path="jquery.min.js" />

/*封装常用分页~组件*/
$.fn.controlPager = function (opts) {
    if (opts == undefined) { return; }

    //总数量必须传
    if (!opts.hasOwnProperty("pageCount")) {
        return;
    }
    if (!opts.hasOwnProperty("pageNow"))
        opts.pageNow = 1;
    if (!opts.hasOwnProperty("pageSize"))
        opts.pageSize = 10;
    if (!opts.hasOwnProperty("pageNum")) {
        opts.pageNum = 5;
    }
    //onSearch
    if (!opts.hasOwnProperty("onPage")) {
        opts.onPage = function () { };
    }
    if (!opts.hasOwnProperty("onSearch")) {
        opts.onSearch = function () { };
    }
    opts.pageStart = 1; //每一页的页码起始数，由pageNow和pageNum动态计算
    opts.pageEnd = 0; //每一页的页码结尾数 ，由pageNow和pageNum动态计算
    var isOdd = true; // 是否是奇数，用于页码偶数跟奇数不同算法 默认5页 是奇数
    if (parseInt(opts.pageNum) % 2 == 0) {
        isOdd = false;
    }

    //更改描述显示
    if (!opts.hasOwnProperty("pagerdesr")) {
        opts.pagerdesr = false;
    }
    //总共分多少页
    var totalpageCount = parseInt((opts.pageCount % opts.pageSize) == 0 ? opts.pageCount / opts.pageSize : opts.pageCount / opts.pageSize + 1);
    if (parseInt(opts.pageNow) <= parseInt(opts.pageNum / 2 + 1)) {
        opts.pageStart = 1;
        opts.pageEnd = opts.pageNum;
    } else if (parseInt(opts.pageNow) > parseInt(opts.pageNum / 2 + 1)) {
        opts.pageStart = parseInt(opts.pageNow) - parseInt(opts.pageNum / 2);
        if (isOdd) {
            opts.pageEnd = parseInt(opts.pageNow) + parseInt(opts.pageNum / 2);
        } else {
            opts.pageEnd = parseInt(opts.pageNow) + parseInt(opts.pageNum / 2 - 1);
        }
    }
    // 对pageEnd 进行校验，并重新赋值
    if (opts.pageEnd > opts.pageCount) {
        opts.pageEnd = opts.pageCount;
    }
    if (opts.pageEnd <= opts.pageNum) { // 当不足pageNum数目时，要全部显示，所以pageStart要始终置为1
        opts.pageStart = 1;
    }
    var pageHtmlData = {
        pagerdesr: '<div class="page-desc">总数据<span>{0}</span>条-共分<span>{1}</span>页</div>'.Format(opts.pageCount, totalpageCount),
        pageUL: ' <ul class="pager">',
        home: '<li><a href="javascript:;"  data-pn="1">首页</a></li>',
        previous: '<li class="previous" ><a href="javascript:;" data-pn="{0}">«</a></li>'.Format((opts.pageNow - 1)),
        btn: '<li class="{1}"><a href="javascript:;"  data-pn="{0}">{0}</a></li>',
        next: '<li class="next"><a href="javascript:;" data-pn="{0}" >»</a></li>'.Format((opts.pageNow + 1)),
        end: '<li><a href="javascript:;" data-pn="{0}">尾页</a></li>'.Format(totalpageCount),
        pageEndUL: ' </ul>',
        pagerSearch: '<div class="page-search-p">' +
            '<div class="input-group">' +
            '        <input type="text" class="form-control" />' +
            '        <span class="input-group-addon" data-page-search="btn"><i class="fa fa-search"></i></span>' +
            '    </div>' +
            '</div>'
    };
    var pageHtml = '';
    for (var i = opts.pageStart; i <= (opts.pageEnd >= totalpageCount ? totalpageCount : opts.pageEnd) ; i++) {
        if (opts.pageNow == i) {
            pageHtml += pageHtmlData.btn.Format(i, "active");
        } else {
            pageHtml += pageHtmlData.btn.Format(i, "");
        }
    }

    //自定义
    if (opts.pagerdesr) {
        pageHtmlData.pagerdesr = opts.pagerdesr.Format(opts.pageCount, totalpageCount);
    }

    //删掉上一页跟首页
    if (opts.pageNow <= 1) {
        pageHtmlData.home = "";
        pageHtmlData.previous = "";
    }
    //结尾删掉下一页跟尾页
    if (opts.pageNow >= totalpageCount) {
        pageHtmlData.next = "";
    }
    if (opts.pageCount == 0) {
        pageHtmlData.pagerSearch = "";
        pageHtmlData.end = "";
    }

    //追加分页
    this.html(
        pageHtmlData.pagerdesr +
        pageHtmlData.pageUL +
        pageHtmlData.home +
        pageHtmlData.previous +
        pageHtml +
        pageHtmlData.next +
        pageHtmlData.end +
        pageHtmlData.pageEndUL +
        pageHtmlData.pagerSearch
    );

    //绑定事件
    //页码点击 返回一个页面数
    this.find(".pager >li >a").click(function () {
        opts.onPage($(this).attr("data-pn"));
    })

    //搜索按钮点击
    this.find("*[data-page-search='btn']").click(function () {
        var txt = $(this).prev().val();
        if (!/^\d+$/.test(txt)) { txt = 1; }
        opts.onSearch(txt);
    })
}
/*
 * url 请求地址
 * success 成功回调
 * params 参数 可选
 * opts 参数 可选
 */
$.fn.ajaxPageTable = function (url, params, success, opts) {
    var $t = this;
    if (opts === undefined) {
        opts = {};
    }
    var _defaultOpts = {
        load: {
            title: "加载中...",
            count: $t.children("thead").children("tr").children("th").length
        },
        error: null,
        pageEl: "#list-page"
    };

    opts = $.extend(_defaultOpts, opts);
    var _TemplateLoad = '<tr><td colspan="' + opts.load.count + '"><div class="table-data-load">' +
        '    <i class="fa fa-spinner fa-pulse"></i>' +
        '    <span>' + opts.load.title + '</span>' +
        '</div></td></tr>';
    var _TemplateNullData = '<tr><td colspan="' + opts.load.count + '"><div class="table-data-null">' +
        '    <i class="fa fa-info-circle"></i>' +
        '    <span>无数据</span>' +
        '</div></td></tr>';

    params = $.extend({ Page: { Index: 1, Size: opts.pageSize, Num: 5 } }, params);

    if (!opts.hasOwnProperty("beforeSend")) {
        opts.beforeSend = function () {
            $t.children("tbody").children("tr").remove();
            $t.children("tbody").append(_TemplateLoad);
        };
    }
    $.http.request(url, params, {
        pass: function (d) {
            $t.children("tbody").children("tr").remove();
            success(d.Data);
            if (d.Data == null || d.Data.length <= 0) {
                $t.children("tbody").children("tr").remove();
                $t.children("tbody").append(_TemplateNullData);
            }
            $(opts.pageEl).controlPager({
                pageCount: d.DataCount,
                pageNow: d.PageIndex,
                pageSize: d.PageSize,
                pageNum: d.PageNum,
                onPage: function (a) {
                    params.Page.Index = a;
                    $($t).ajaxPageTable(url, params, success, opts);
                },
                onSearch: function (a) {
                    params.Page.Index = a;
                    $($t).ajaxPageTable(url, params, success, opts);
                }
            });
        }
    }, {
        beforeSend: opts.beforeSend,
        error: opts.error,
        complete: function (XMLHttpRequest, textStatus) {
            XMLHttpRequest = null;
        }
    });
}

/*
 * 分页数据版本 不进行任何加载操作返回源数据
 */
$.fn.ajaxPageListData = function (url, success, params, opts) {
    var $t = this;
    var _defaultOpts = { pageEl: "#list-page" };
    params = $.extend({ Page: { Index: 1, Size: 10, Num: 5 } }, params);
    opts = $.extend(_defaultOpts, opts);
    $.http.json(url, params, {
        pass: function (d) {
            success(d.Data);
            $(opts.pageEl).controlPager({
                pageCount: d.DataCount,
                pageNow: d.PageIndex,
                pageSize: d.PageSize,
                pageNum: d.PageNum,
                onPage: function (a) {
                    params.Page.Index = a;
                    $($t).ajaxPageListData(url, success, params, opts);
                },
                onSearch: function (a) {
                    params.Page.Index = a;
                    $($t).ajaxPageListData(url, success, params, opts);
                }
            });
        }
    }, {
        jquery: {
            error: opts.error,
            complete: function (XMLHttpRequest, textStatus) {
                XMLHttpRequest = null;
            }
        }
    });
}

/*
 * 滚动刷新 
 * url:请求地址
 * sufu:成功回调
 * params 请求参数
 *   默认: pIndex =1
 * sufu:成功回调函数
 * opts:可扩展的参数 
 *   opts.jquery = JQuery ajax 原生态的参数 
 *   opts.tdistance 离下一次滚动多少高度触发(单位/px) 默认20
 *   opts.tip 各种滚动情况下的提示信息
 *   opts.tip.start 开始准备滚动加载 默认:正在加载中...
 *   opts.tip.null 没有数据情况下的提示 默认:已经没有更多数据了
 *   opts.tip.roll 滚动中的提示 默认:滚动加载数据
 */
$.fn.ajaxScrollPage = function (url, sufu, params, opts) {
    var _this = this;
    var _loadState = false;
    var _LoadSelect;
    var _defaultOpts = {
        jQuery: { dataType: "json" },
        load: {
            el: $(".ajax-scroll-page"),
            tip: {
                start: {
                    icon: '<i class="fa fa-spinner fa-spin"></i>&nbsp;',
                    text: '正在加载中...'
                },
                roll: {
                    icon: '<i class="fa fa-spinner fa-spin"></i>&nbsp;',
                    text: '滚动加载数据'
                },
                dataNull: {
                    icon: '<i class="fa fa-check-circle"></i>&nbsp;',
                    text: '已经没有更多数据了'
                }
            }
        }
    };
    var _Data = $.extend({ Page: { Index: 1, Size: 10, Num: 5 } }, params);
    opts = $.extend(_defaultOpts, opts);
    if (opts.load.hasOwnProperty("el")) {
        _LoadSelect = $(opts.load.el);
    }
    opts.jQuery.beforeSend = function () {
        _loadState = false;
        _LoadSelect.show().html(opts.load.tip.start.icon + opts.load.tip.start.text);
    };
    if (!opts.hasOwnProperty("tdistance")) {
        opts.tdistance = 20;
    }

    function _Ajax() {
        $.http.request(url, _Data, function (d) {
            if (d.Data == null || d.Data.length <= 0) {
                _LoadSelect.html(opts.load.tip.dataNull.icon + opts.load.tip.dataNull.text);
                return;
            }
            if (_Data.Page.Index > $.CalculatePage(d.DataCount, d.PageSize)) {
                _LoadSelect.html(opts.load.tip.dataNull.icon + opts.load.tip.dataNull.text);
                return;
            };
            _LoadSelect.show().html(opts.load.tip.roll.icon + opts.load.tip.roll.text);
            sufu(d);
            if (d.Data.length <= d.PageSize && $.CalculatePage(d.DataCount, d.PageSize) <= 1) {
                _LoadSelect.html(opts.load.tip.dataNull.icon + opts.load.tip.dataNull.text);
                return;
            }
            _loadState = true;
        }, opts.jQuery);
    }
    _Ajax();
    _this.unbind("scroll").bind("scroll", function () {
        if ((opts.tdistance + _this.scrollTop()) >= ($(document.body).height() - _this.height())) {
            if (!_loadState) { return; }
            _Data.Page.Index++;
            _Ajax();
        }
    })
}
/*
 * 获取当前table中选中的多选按钮
 * opts 可以选 
     默认选中 data-id 属性值
     返回格式 v,v,v 字符串
     设置 object类型 将返回 数组
 */

$.fn.getTableChecked = function (opts) {
    opts = $.extend({ at: "", type: "," }, opts);
    if (typeof (opts.type) === "object") {
        return this.find("input[type='checkbox'][data-checked-table='single']:checked")
            .map(function () {
                return opts.at == "" ? $(this).val() : $(this).attr(opts.at);
            }).get();
    }
    return this.find("input[type='checkbox'][data-checked-table='single']:checked")
        .map(function () {
            return opts.at == "" ? $(this).val() : $(this).attr(opts.at);
        }).get().join(opts.type);
}
/*
 * 绑定全选按钮
 */
$(function () {
    if ($('[data-toggle="tooltip"]').length > 0) {
        //$('[data-toggle="tooltip"]').tooltip({ placement: 'bottom' });
    }
    $(document.body).on("click", "input[type='checkbox'][data-checked-table='all']", function () {
        if ($(this).is(":checked")) {
            $("input[type='checkbox'][data-checked-table='single']").prop("checked", true)
                .parents("tr").addClass("active");
            return;
        }
        $("input[type='checkbox'][data-checked-table='single']").prop("checked", false).parents("tr").removeClass("active");;
        $.allDelBtn();
    });

    $(document.body).on("click", "a[data-btn-eidt]", function () {
        var _val = $(this).attr("data-btn-eidt");
        if (_val === undefined || _val == null || _val == "") { return; }
        var _table = $(this).attr("data-btn-eidt-target");
        if (_table === undefined || _table == null || _table == "") {
            _table = "#table";
        }
        var _check = $(_table).children("tbody").children("tr").find("input[type='checkbox'][data-checked-table='single']:checked");
        if (_check.length > 1) {
            $.msgFall("编辑只能选中一个");
            return;
        }
        var _checkval = _check.parents("tr").attr("data-eidt");
        if (_checkval === undefined || _checkval == null || _checkval == "") { $.msgFall("请选中一个需要的编辑项"); return; }
        window.location.href = _val + _checkval;
    })

    $(document.body).on("click", "a[data-btn-add]", function () {
        window.location.href = $(this).attr("data-btn-add");
    })
    $(document.body).on("click", "input[type='checkbox'][data-checked-table='single']", function (e) {
        if ($(this).is(":checked")) {
            $(this).parents("tr").addClass("active");
        } else {
            $(this).parents("tr").removeClass("active");
        }
        var _count = $("input[type='checkbox'][data-checked-table='single']").length == $("input[type='checkbox'][data-checked-table='single']:checked").length;
        if (_count) {
            $("input[type='checkbox'][data-checked-table='all']").prop("checked", true);
        } else {
            $("input[type='checkbox'][data-checked-table='all']").prop("checked", false);
        }
        if ($("input[type='checkbox'][data-checked-table='single']:checked").length <= 0) {
            $("input[type='checkbox'][data-checked-table='all']").prop("checked", false);
        }
    });

    //刷新当前页面
    $(document.body).on("click", "*[data-refresh='thispage']", function () {
        window.location.reload();
    });

    //清空时间内容
    $(document.body).on("click", "*[data-empty-drtp]", function () {
        $(this).prev("input[type='text']").val("");
    });

});

$.extend({
    allDelBtn: function (o) {
        var obj = $('a[data-del-all-checked="true"]');
        if (o == 's') {
            obj.css({ display: "inline-block" }).addClass("alldel-btn-in");
            return;
        }
        obj.removeClass("alldel-btn-in").addClass("alldel-btn-out");
        setTimeout(function () {
            obj.css({ display: "none" });
        }, 330);
    }
})